package cn.tedu.charging.order.mqtt;

import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;

/**
 * 是当前业务中对所有消息发送数据的封装
 * 既可以发送订单消息，也可以发送计价消息、充电消息等
 */
@Component
@Slf4j
public class MqttProducer<T> {
    @Autowired
    private MqttClient mqttClient;

    // 给业务层一个生产发送消息的方法
    // 1. 发送到目标dest
    // 2. 发送的消息数据
    // 3. 反馈的发送结果 -> 成功/失败 布尔值
    public boolean send(String dest, T msg) {
        // 消息的序列化问题 T --> String json--> byte[]
        byte[] payload = serialize(msg);
        // 向dest发送payload，qos设置为1（可能重试发送），并且要求主题保存消息（每有一个新的消费者，就会重新获取此前的所有消息）
        // 容易造成重复消费
        try {
            mqttClient.publish(dest, payload, 1, true);
        } catch (Exception e) {
            log.error("向topic：{} 发送消息：{} 失败", dest, msg);
            return false;
        }
        log.debug("向topic：{} 发送消息：{} 成功", dest, msg);
        return true;
    }

    private byte[] serialize(T msg) {
        // 转化json
        String jsonString = JSON.toJSONString(msg);
        return jsonString.getBytes(StandardCharsets.UTF_8);
    }
}
